package top.tagao.m03_beHavioralPatterns.b_08_observer;

import top.tagao.m03_beHavioralPatterns.b_08_observer.editor.Editor;
import top.tagao.m03_beHavioralPatterns.b_08_observer.listeners.EmailNotificationListener;
import top.tagao.m03_beHavioralPatterns.b_08_observer.listeners.LogOpenListener;

/**
 * 观察者模式
 *
 * @author Viktor_Liu
 * @Date 2022/8/14 10:27
 * 1. 发布者（Publisher）会向其他对象发送值得关注的事件。事
 * 件会在发布者自身状态改变或执行特定行为后发生。发布者
 * 中包含一个允许新订阅者加入和当前订阅者离开列表的订阅
 * 构架。
 * <p>
 * 2. 当新事件发生时，发送者会遍历订阅列表并调用每个订阅者
 * 对象的通知方法。该方法是在订阅者接口中声明的。
 * <p>
 * 3. 订阅者（Subscriber）接口声明了通知接口。 在绝大多数情
 * 况下，该接口仅包含一个 update 更新 方法。该方法可以
 * 拥有多个参数，使发布者能在更新时传递事件的详细信息。
 * <p>
 * 4. 具体订阅者（Concrete Subscribers）可以执行一些操作来回
 * 应发布者的通知。 所有具体订阅者类都实现了同样的接口，
 * 因此发布者不需要与具体类相耦合。
 */
public class Main {
    public static void main(String[] args) {
        //创建 具体发布者， 由其他对象追踪
        Editor editor = new Editor();

        //2.创建具体的订阅者，并将具体的订阅者放入发布者的订阅列表中
        editor.events.subscribe("open", new LogOpenListener("/path/to/log/file.txt"));
        editor.events.subscribe("save", new EmailNotificationListener("admin@example.com"));

        try {
            editor.openFile("test.txt");
            editor.saveFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
